import { FileHeader } from "./FileHeader.ts";
import { OptionalHeader } from "./OptionalHeader.ts";

/**
 * 解析文件头部信息，包含文件签名、文件头和可选头。
 * @author tongxin
 * @date 2024/4/18 21:49
 */
export class NtHeader {
  /**
   * NT头的魔数，用于标识PE格式的文件。PE是Windows可执行文件的格式。
   */
  static NT_HEADER_MAGIC = 0x4550 as const;

  /**
   * NT_HEADER_MAGIC的字节长度，用于确保在读取文件时对齐到正确的字节位置。
   */
  static NT_HEADER_MAGIC_LENGTH = 4 as const;
  static LENGTH = 0xF8 as const;

  /**
   * 文件的签名，用于验证文件的格式和完整性。
   */
  signature: number;

  /**
   * 文件头，包含有关文件的基本信息，如文件大小、入口点等。
   */
  fileHeader: FileHeader;

  /**
   * 可选头，包含关于可执行文件的更详细的信息，如DLL标志、基地址等。
   */
  optionalHeader?: OptionalHeader;


  constructor(byteArray: IByteArray) {
    // 读取并验证MZ签名
    this.signature = byteArray.readDWord();
    if (NtHeader.NT_HEADER_MAGIC != this.signature) {
      throw new Error("Invalid PE file: Missing PE signature");
    }
    this.fileHeader = new FileHeader(byteArray.read(FileHeader.FILE_HEADER_SIZE));
    this.optionalHeader = new OptionalHeader(byteArray.read(this.fileHeader.sizeOfOptionalHeader));
  }
}
